package com.bayleaf.common;

import java.util.*;
import java.text.*;
import java.sql.Timestamp;

/**
 * <p>DateUtil
 * <p>날자 관련 Utility
 * <br>
 * @author 이다건
 * @version 1.0
 */
public class DateUtil {
    final public static int FORMAT_UNKNOWN=0;
    final public static int FORMAT_YYYYMMDD=123;
    final public static int FORMAT_MMDDYYYY=231;
    final public static int FORMAT_DDMMYYYY=321;

    private static int[][] matchTable = {
            // 1881
            { 1, 2, 1, 2, 1, 2, 2, 3, 2, 2, 1, 2, 1 },
            { 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
            { 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 0 },
            { 2, 1, 1, 2, 1, 3, 2, 1, 2, 2, 1, 2, 2 },
            { 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0 },
            { 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
            { 2, 2, 1, 2, 3, 2, 1, 1, 2, 1, 2, 1, 2 },
            { 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
            { 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0 },
            { 1, 2, 3, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2 },
            // 1891
            { 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
            { 1, 1, 2, 1, 1, 2, 3, 2, 2, 1, 2, 2, 2 },
            { 1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0 },
            { 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0 },
            { 2, 1, 2, 1, 2, 3, 1, 2, 1, 2, 1, 2, 1 },
            { 2, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
            { 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0 },
            { 2, 1, 2, 3, 2, 2, 1, 2, 1, 2, 1, 2, 1 },
            { 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 0 },
            { 1, 2, 1, 1, 2, 1, 2, 2, 3, 2, 2, 1, 2 },
            // 1901
            { 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0 },
            { 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0 },
            { 1, 2, 1, 2, 1, 3, 2, 1, 1, 2, 2, 1, 2 },
            { 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 0 },
            { 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
            { 1, 2, 2, 1, 4, 1, 2, 1, 2, 1, 2, 1, 2 },
            { 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0 },
            { 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 0 },
            { 1, 2, 3, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2 },
            { 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0 },
            // 1911
            { 2, 1, 2, 1, 1, 2, 3, 1, 2, 2, 1, 2, 2 },
            { 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 0 },
            { 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 0 },
            { 2, 2, 1, 2, 2, 3, 1, 2, 1, 2, 1, 1, 2 },
            { 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0 },
            { 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0 },
            { 2, 1, 3, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1 },
            { 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 0 },
            { 1, 2, 1, 1, 2, 1, 2, 3, 2, 2, 1, 2, 2 },
            { 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 0 },
            // 1921
            { 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 0 },
            { 2, 1, 2, 2, 1, 3, 2, 1, 1, 2, 1, 2, 2 },
            { 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 0 },
            { 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 0 },
            { 2, 1, 2, 2, 3, 2, 1, 2, 2, 1, 2, 1, 2 },
            { 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
            { 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
            { 1, 2, 3, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2 },
            { 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 0 },
            { 1, 2, 2, 1, 1, 2, 3, 1, 2, 1, 2, 2, 1 },
            // 1931
            { 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
            { 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 0 },
            { 1, 2, 2, 1, 2, 4, 1, 2, 1, 2, 1, 1, 2 },
            { 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 0 },
            { 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
            { 2, 1, 1, 4, 1, 2, 1, 2, 1, 2, 2, 2, 1 },
            { 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 0 },
            { 2, 2, 1, 1, 2, 1, 1, 4, 1, 2, 2, 1, 2 },
            { 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
            { 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
            // 1941
            { 2, 2, 1, 2, 2, 1, 4, 1, 1, 2, 1, 2, 1 },
            { 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 0 },
            { 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 0 },
            { 1, 1, 2, 1, 4, 1, 2, 1, 2, 2, 1, 2, 2 },
            { 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 0 },
            { 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 0 },
            { 2, 2, 3, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2 },
            { 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
            { 2, 2, 1, 2, 1, 2, 1, 3, 2, 1, 2, 1, 2 },
            { 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
            // 1951
            { 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0 },
            { 1, 2, 1, 2, 1, 4, 2, 1, 2, 1, 2, 1, 2 },
            { 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 0 },
            { 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
            { 2, 1, 1, 4, 1, 1, 2, 1, 2, 1, 2, 2, 2 },
            { 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0 },
            { 2, 1, 2, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2 },
            { 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
            { 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0 },
            { 2, 1, 2, 1, 2, 2, 3, 2, 1, 2, 1, 2, 1 },
            // 1961
            { 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 0 },
            { 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
            { 2, 1, 2, 1, 3, 2, 1, 2, 1, 2, 2, 2, 1 },
            { 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0 },
            { 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 0 },
            { 2, 2, 2, 3, 2, 1, 1, 2, 1, 1, 2, 2, 1 },
            { 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
            { 1, 2, 2, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2 },
            { 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0 },
            { 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 0 },
            // 1971
            { 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2, 1, 2 },
            { 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0 },
            { 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1, 0 },
            { 2, 2, 1, 2, 3, 1, 2, 1, 1, 2, 2, 1, 2 },
            { 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 0 },
            { 2, 2, 1, 2, 1, 2, 1, 2, 3, 2, 1, 1, 2 },
            { 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 0 },
            { 2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0 },
            { 2, 1, 1, 2, 1, 2, 4, 1, 2, 2, 1, 2, 1 },
            { 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
            // 1981
            { 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 0 },
            { 2, 1, 2, 1, 3, 2, 1, 1, 2, 2, 1, 2, 2 },
            { 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 0 },
            { 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 3, 2, 2 },
            { 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 0 },
            { 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 0 },
            { 2, 1, 2, 2, 1, 2, 3, 2, 2, 1, 2, 1, 2 },
            { 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
            { 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
            { 1, 2, 1, 1, 2, 3, 1, 2, 1, 2, 2, 2, 2 },
            // 1991
            { 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 0 },
            { 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 0 },
            { 1, 2, 2, 3, 2, 1, 2, 1, 1, 2, 1, 2, 1 },
            { 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 0 },
            { 1, 2, 2, 1, 2, 2, 1, 2, 3, 2, 1, 1, 2 },
            { 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 0 },
            { 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
            { 2, 1, 1, 2, 1, 3, 2, 2, 1, 2, 2, 2, 1 },
            { 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 0 },
            { 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 0 },
            // 2001
            { 2, 2, 2, 1, 3, 2, 1, 1, 2, 1, 2, 1, 2 },
            { 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
            { 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 0 },
            { 1, 2, 3, 2, 2, 1, 2, 1, 2, 2, 1, 1, 2 },
            { 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 0 },
            { 2, 1, 2, 1, 2, 1, 2, 3, 2, 2, 1, 2, 2 },
            { 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 0 },
            { 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 0 },
            { 2, 2, 1, 1, 2, 3, 1, 2, 1, 2, 1, 2, 2 },
            { 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
            // 2011
            { 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
            { 2, 1, 2, 4, 2, 1, 2, 1, 1, 2, 1, 2, 1 },
            { 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0 },
            { 1, 2, 1, 2, 1, 2, 1, 2, 2, 3, 2, 1, 2 },
            { 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 0 },
            { 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
            { 2, 1, 1, 2, 1, 3, 2, 1, 2, 1, 2, 2, 2 },
            { 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0 },
            { 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
            { 2, 1, 2, 2, 3, 2, 1, 1, 2, 1, 2, 1, 2 },
            // 2021
            { 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0 },
            { 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 0 },
            { 1, 2, 3, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2 },
            { 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
            { 2, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2, 1 },
            { 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0 },
            { 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 0 },
            { 1, 2, 2, 1, 2, 3, 1, 2, 1, 1, 2, 2, 1 },
            { 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 0 },
            { 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 0 },
            // 2031
            { 2, 1, 2, 3, 2, 1, 2, 2, 1, 2, 1, 2, 1 },
            { 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 0 },
            { 1, 2, 1, 1, 2, 1, 2, 3, 2, 2, 2, 1, 2 },
            { 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0 },
            { 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 0 },
            { 2, 2, 1, 2, 1, 1, 4, 1, 1, 2, 1, 2, 2 },
            { 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 0 },
            { 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 0 },
            { 2, 2, 1, 2, 2, 3, 2, 1, 2, 1, 2, 1, 1 },
            { 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0 },
            // 2041
            { 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 0 },
            { 1, 2, 3, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2 },
            { 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 0 }
        };

    private static int lunarMonthDay[] = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    // 음력의 윤달여부
    private static boolean leapMonth;

    public static boolean isLeapMonth(){
        return leapMonth;
    }

    /**
     * 양력 -> 음력 변환
     * 신혜원 수정
     */
    public static Calendar getLunar(Calendar cal) {
        int yyyy=cal.get(Calendar.YEAR);
        int mm=cal.get(Calendar.MONTH)+1;
        int dd=cal.get(Calendar.DATE);

        int lunarYyyy, lunarMm, lunarDd;

        int[] dt = new int[163];
        int td1, td2,  k11, td, td0, t1, t2, jcount, m2, m1, m0, w, ti1, tj1;

        for (int i=0; i<matchTable.length; i++) {
            dt[i] = 0;
            for (int j=0; j<12; j++){
                if (matchTable[i][j]%2 == 1) dt[i] +=29;
                else dt[i] +=30;
            }
            if (matchTable[i][12] == 0) dt[i] += 0;
            else if ((matchTable[i][12] % 2) == 1 ) dt[i] += 29;
            else dt[i] += 30;
        }

        td1 = 1880*365 + (int)((double)1880/(double)4) - (int)((double)1880/(double)100) + (int)((double)1880/(double)400) + 30;
        k11 = yyyy - 1;
        td2 = k11*365 + (int)((double)k11/(double)4) - (int)((double)k11/(double)100) + (int)((double)k11/(double)400);

        if((yyyy%400 == 0) || (yyyy%100 != 0) & (yyyy%4 == 0)) lunarMonthDay[1] = 29;
        else lunarMonthDay[1] = 28;

        for (int i=0; i<mm-1 ; i++) {
            td2 += lunarMonthDay[i];
        }
        td2 += dd;
        td = td2 - td1 + 1;
        td0 = dt[0];
        t1 = 0;
        for( t1=0 ; t1<163 ; t1++) {
            if( td <= td0 ) break;
            td0 += dt[t1+1];
        }

        lunarYyyy = t1 + 1881;
        td0 -= dt[t1];
        td -= td0;

        jcount = 12;
        if( matchTable[t1][12] !=0 )jcount = 13;

        m2 = 0;
        t2 = 0;
        for (t2 =0; t2 < jcount ; t2++) {
            if( matchTable[t1][t2] <=2 ) {
                m2++;
                m1 = matchTable[t1][t2] + 28;
            } else {
                m1 = matchTable[t1][t2] + 26;
            }
            if (td <= m1) break;
            td -= m1;
        }
        m0 = t2;
        lunarMm = m2;
        lunarDd = td;
        w = td2%7;

        t1 = (int)( (td2 +4) % 10 );
        t2 = (int)( (td2 +2) % 12 );
        ti1 = (lunarYyyy + 6) % 10;
        tj1 = (lunarYyyy + 8) % 12;
        if (matchTable[lunarYyyy-1881][12] > 0  & matchTable[lunarYyyy-1881][m0] >2) { //이경우 음력 윤달
            leapMonth = true;
        }

        return getCalendar(lunarYyyy, lunarMm, lunarDd);
    }

    public static Date getLunar(Date dateParam) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(dateParam);
        Calendar lunar=getLunar(cal);
        return lunar.getTime();
    }

    public static Timestamp getLunar(Timestamp timestampParam) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(timestampParam);
        Calendar lunar=getLunar(cal);
        return new Timestamp(lunar.getTime().getTime());
    }

    /**
     * 윤년여부를 판단한다.
     */
    private static boolean isLeapYear (int year) {
        return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0));
    }

    /**
     * year, month 내의 일수를 계산한다.
     */
    public static int getDaysInMonth(int year,int month)  {
        int days=0;
        if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)  days=31;
        else if (month==4 || month==6 || month==9 || month==11) days=30;
        else if (month==2)  {
          if (isLeapYear(year)) { days=29; }
          else { days=28; }
        }
        return days;
    }

    /**
     * Calendar내의 년월일을 YYYYMMDD형식의 문자열로 변환한다.
     */
    public static String getYYYYMMDD(Calendar cal) {
        String YYMMDD=null;
        int yyyy=cal.get(Calendar.YEAR);
        int mm=cal.get(Calendar.MONTH)+1;
        int dd=cal.get(Calendar.DATE);
        YYMMDD=Integer.toString(yyyy);
        if (mm<10) {YYMMDD=YYMMDD+"0"+Integer.toString(mm);}
        else {YYMMDD=YYMMDD+Integer.toString(mm);}
        if (dd<10) {YYMMDD=YYMMDD+"0"+Integer.toString(dd);}
        else {YYMMDD=YYMMDD+Integer.toString(dd);}
        return YYMMDD;
    }

    /**
     * Calendar내의 년월일을 YYYYMMDDHHMISS형식의 문자열로 변환한다.
     */
    public static String getYYYYMMDDHHMISS(Calendar cal) {
        String YYMMDDHHMISS=null;
        int yyyy=cal.get(Calendar.YEAR);
        int mm=cal.get(Calendar.MONTH)+1;
        int dd=cal.get(Calendar.DATE);
        int hh=cal.get(Calendar.HOUR_OF_DAY);
        int mi=cal.get(Calendar.MINUTE);
        int ss=cal.get(Calendar.SECOND);

        YYMMDDHHMISS=Integer.toString(yyyy);
        if (mm<10) {YYMMDDHHMISS=YYMMDDHHMISS+"0"+Integer.toString(mm);}
        else {YYMMDDHHMISS=YYMMDDHHMISS+Integer.toString(mm);}
        if (dd<10) {YYMMDDHHMISS=YYMMDDHHMISS+"0"+Integer.toString(dd);}
        else {YYMMDDHHMISS=YYMMDDHHMISS+Integer.toString(dd);}
        if (hh<10) {YYMMDDHHMISS=YYMMDDHHMISS+"0"+Integer.toString(hh);}
        else {YYMMDDHHMISS=YYMMDDHHMISS+Integer.toString(hh);}
        if (mi<10) {YYMMDDHHMISS=YYMMDDHHMISS+"0"+Integer.toString(mi);}
        else {YYMMDDHHMISS=YYMMDDHHMISS+Integer.toString(mi);}
        if (ss<10) {YYMMDDHHMISS=YYMMDDHHMISS+"0"+Integer.toString(ss);}
        else {YYMMDDHHMISS=YYMMDDHHMISS+Integer.toString(ss);}
        return YYMMDDHHMISS;
    }

    /**
     * Calendar내의 년월일을 MMDDYYYY형식의 문자열로 변환한다.
     */
    public static String getMMDDYYYY(Calendar cal) {
        String MMDDYY=null;
        int yyyy=cal.get(Calendar.YEAR);
        int mm=cal.get(Calendar.MONTH)+1;
        int dd=cal.get(Calendar.DATE);

        if (mm<10) {MMDDYY = "0"+Integer.toString(mm);}
        else {MMDDYY = Integer.toString(mm);}
        if (dd<10) {MMDDYY=MMDDYY+"0"+Integer.toString(dd);}
        else {MMDDYY=MMDDYY+Integer.toString(dd);}
        MMDDYY =MMDDYY+Integer.toString(yyyy);
        return MMDDYY;
    }

    /**
     * Calendar내의 년월일을 MMDDYYYYHHMISS형식의 문자열로 변환한다.
     */
    public static String getMMDDYYYYHHMISS(Calendar cal) {
        String MMDDYYHHMISS=null;
        int yyyy=cal.get(Calendar.YEAR);
        int mm=cal.get(Calendar.MONTH)+1;
        int dd=cal.get(Calendar.DATE);
        int hh=cal.get(Calendar.HOUR_OF_DAY);
        int mi=cal.get(Calendar.MINUTE);
        int ss=cal.get(Calendar.SECOND);

        if (mm<10) {MMDDYYHHMISS = "0"+Integer.toString(mm);}
        else {MMDDYYHHMISS = Integer.toString(mm);}
        if (dd<10) {MMDDYYHHMISS=MMDDYYHHMISS+"0"+Integer.toString(dd);}
        else {MMDDYYHHMISS=MMDDYYHHMISS+Integer.toString(dd);}
        MMDDYYHHMISS =MMDDYYHHMISS+Integer.toString(yyyy);
        if (hh<10) {MMDDYYHHMISS=MMDDYYHHMISS+"0"+Integer.toString(hh);}
        else {MMDDYYHHMISS=MMDDYYHHMISS+Integer.toString(hh);}
        if (mi<10) {MMDDYYHHMISS=MMDDYYHHMISS+"0"+Integer.toString(mi);}
        else {MMDDYYHHMISS=MMDDYYHHMISS+Integer.toString(mi);}
        if (ss<10) {MMDDYYHHMISS=MMDDYYHHMISS+"0"+Integer.toString(ss);}
        else {MMDDYYHHMISS=MMDDYYHHMISS+Integer.toString(ss);}
        return MMDDYYHHMISS;
    }

    /**
     * Calendar내의 년월일을 DDMMYYYY형식의 문자열로 변환한다.
     */
    public static String getDDMMYYYY(Calendar cal) {
        String MMDDYY=null;
        int yyyy=cal.get(Calendar.YEAR);
        int mm=cal.get(Calendar.MONTH)+1;
        int dd=cal.get(Calendar.DATE);

        if (dd<10) {MMDDYY="0"+Integer.toString(dd);}
        else {MMDDYY=Integer.toString(dd);}
        if (mm<10) {MMDDYY = MMDDYY+"0"+Integer.toString(mm);}
        else {MMDDYY = MMDDYY+Integer.toString(mm);}

        MMDDYY =MMDDYY+Integer.toString(yyyy);
        return MMDDYY;
    }

    /**
     * Calendar내의 년월일을 DDMMYYYYHHMISS형식의 문자열로 변환한다.
     */
    public static String getDDMMYYYYHHMISS(Calendar cal) {
        String DDMMYYHHMISS=null;
        int yyyy=cal.get(Calendar.YEAR);
        int mm=cal.get(Calendar.MONTH)+1;
        int dd=cal.get(Calendar.DATE);
        int hh=cal.get(Calendar.HOUR_OF_DAY);
        int mi=cal.get(Calendar.MINUTE);
        int ss=cal.get(Calendar.SECOND);

        if (dd<10) {DDMMYYHHMISS="0"+Integer.toString(dd);}
        else {DDMMYYHHMISS=Integer.toString(dd);}
        if (mm<10) {DDMMYYHHMISS = DDMMYYHHMISS+"0"+Integer.toString(mm);}
        else {DDMMYYHHMISS = DDMMYYHHMISS+Integer.toString(mm);}
        DDMMYYHHMISS =DDMMYYHHMISS+Integer.toString(yyyy);
        if (hh<10) {DDMMYYHHMISS=DDMMYYHHMISS+"0"+Integer.toString(hh);}
        else {DDMMYYHHMISS=DDMMYYHHMISS+Integer.toString(hh);}
        if (mi<10) {DDMMYYHHMISS=DDMMYYHHMISS+"0"+Integer.toString(mi);}
        else {DDMMYYHHMISS=DDMMYYHHMISS+Integer.toString(mi);}
        if (ss<10) {DDMMYYHHMISS=DDMMYYHHMISS+"0"+Integer.toString(ss);}
        else {DDMMYYHHMISS=DDMMYYHHMISS+Integer.toString(ss);}

        return DDMMYYHHMISS;
    }

    /**
     * Date Type의 년월일을 YYYYMMDD형식의 문자열로 변환한다.
     */
    public static String getYYYYMMDD(Date d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getYYYYMMDD(cal);
    }

    /**
     * Date Type의 년월일을 YYYYMMDDHHMISS형식의 문자열로 변환한다.
     */
    public static String getYYYYMMDDHHMISS(Date d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getYYYYMMDDHHMISS(cal);
    }

    /**
     * Date Type의 년월일을 MMDDYYYY형식의 문자열로 변환한다.
     */
    public static String getMMDDYYYY(Date d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getMMDDYYYY(cal);
    }

    /**
     * Date Type의 년월일을 MMDDYYYYHHMISS형식의 문자열로 변환한다.
     */
    public static String getMMDDYYYYHHMISS(Date d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getMMDDYYYYHHMISS(cal);
    }

    /**
     * Date Type의 년월일을 DDMMYYYY형식의 문자열로 변환한다.
     */
    public static String getDDMMYYYY(Date d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getDDMMYYYY(cal);
    }

    /**
     * Date Type의 년월일을 DDMMYYYYHHMISS형식의 문자열로 변환한다.
     */
    public static String getDDMMYYYYHHMISS(Date d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getDDMMYYYYHHMISS(cal);
    }

    /**
     * Timestamp Type의 년월일을 YYYYMMDD형식의 문자열로 변환한다.
     */
    public static String getYYYYMMDD(Timestamp d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getYYYYMMDD(cal);
    }

    /**
     * Timestamp Type의 년월일을 YYYYMMDDHHMISS형식의 문자열로 변환한다.
     */
    public static String getYYYYMMDDHHMISS(Timestamp d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getYYYYMMDDHHMISS(cal);
    }

    /**
     * Timestamp Type의 년월일을 MMDDYYYY형식의 문자열로 변환한다.
     */
    public static String getMMDDYYYY(Timestamp d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getMMDDYYYY(cal);
    }

    /**
     * Timestamp Type의 년월일을 MMDDYYYYHHMISS형식의 문자열로 변환한다.
     */
    public static String getMMDDYYYYHHMISS(Timestamp d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getMMDDYYYYHHMISS(cal);
    }

    /**
     * Timestamp Type의 년월일을 MMDDYYYY형식의 문자열로 변환한다.
     */
    public static String getDDMMYYYY(Timestamp d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getDDMMYYYY(cal);
    }

    /**
     * Timestamp Type의 년월일을 MMDDYYYYHHMISS형식의 문자열로 변환한다.
     */
    public static String getDDMMYYYYHHMISS(Timestamp d) {
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        return getDDMMYYYYHHMISS(cal);
    }

    protected static int getMillisInDate(Calendar cal) {
        return cal.get(Calendar.HOUR_OF_DAY)*360000+
                cal.get(Calendar.MINUTE)*60000+
                cal.get(Calendar.SECOND)*1000+
                cal.get(Calendar.MILLISECOND);
    }

    public static int getOffset(Calendar cal,TimeZone tz) {
        return tz.getOffset(
                cal.get(Calendar.ERA),cal.get(Calendar.YEAR),
                cal.get(Calendar.MONTH),cal.get(Calendar.DAY_OF_MONTH),
                cal.get(Calendar.DAY_OF_WEEK),
                getMillisInDate(cal));
    }

    /**
     * YYYYMMDD형식의 문자열을 Calendar형식으로 변환
     */
    public static Calendar getCalendarYYYYMMDD(String YYYYMMDD,TimeZone tz) throws NumberFormatException {
        Calendar cal=Calendar.getInstance();
        String yyyyStr=YYYYMMDD.substring(0,4);
        String mmStr=YYYYMMDD.substring(4,6);
        String ddStr=YYYYMMDD.substring(6,8);
        int yyyy=Integer.parseInt(yyyyStr);
        int mm=Integer.parseInt(mmStr);
        int dd=Integer.parseInt(ddStr);
        int hh=0;
        int mi=0;
        int ss=0;
        if (YYYYMMDD.length()>=10) hh=Integer.parseInt(YYYYMMDD.substring(8,10));
        if (YYYYMMDD.length()>=12) mi=Integer.parseInt(YYYYMMDD.substring(10,12));
        if (YYYYMMDD.length()>=14) ss=Integer.parseInt(YYYYMMDD.substring(12,14));

        TimeZone defaultTZ=TimeZone.getDefault();
        cal.clear();
        cal.setTimeZone(defaultTZ);
        cal.set(yyyy,mm-1,dd,hh,mi,ss);
        cal.add(Calendar.MILLISECOND,-getOffset(cal,tz));
        cal.add(Calendar.MILLISECOND,getOffset(cal,defaultTZ));
        return cal;
    }

    public static Calendar getCalendarYYYYMMDD(String YYYYMMDD) throws NumberFormatException {
        Calendar cal=Calendar.getInstance();
        String yyyyStr=YYYYMMDD.substring(0,4);
        String mmStr=YYYYMMDD.substring(4,6);
        String ddStr=YYYYMMDD.substring(6,8);
        int yyyy=Integer.parseInt(yyyyStr);
        int mm=Integer.parseInt(mmStr);
        int dd=Integer.parseInt(ddStr);
        int hh=0;
        int mi=0;
        int ss=0;
        if (YYYYMMDD.length()>=10) hh=Integer.parseInt(YYYYMMDD.substring(8,10));
        if (YYYYMMDD.length()>=12) mi=Integer.parseInt(YYYYMMDD.substring(10,12));
        if (YYYYMMDD.length()>=14) ss=Integer.parseInt(YYYYMMDD.substring(12,14));
        cal.clear();
        cal.set(yyyy,mm-1,dd,hh,mi,ss);
        return cal;
    }

    /**
     * MMDDYYYY형식의 문자열을 Calendar형식으로 변환
     */
    public static Calendar getCalendarMMDDYYYY(String MMDDYYYY,TimeZone tz) throws NumberFormatException {
        Calendar cal=Calendar.getInstance();
        String mmStr=MMDDYYYY.substring(0,2);
        String ddStr=MMDDYYYY.substring(2,4);
        String yyyyStr=MMDDYYYY.substring(4,8);
        int mm=Integer.parseInt(mmStr);
        int dd=Integer.parseInt(ddStr);
        int yyyy=Integer.parseInt(yyyyStr);
        int hh=0;
        int mi=0;
        int ss=0;
        if (MMDDYYYY.length()>=10) hh=Integer.parseInt(MMDDYYYY.substring(8,10));
        if (MMDDYYYY.length()>=12) mi=Integer.parseInt(MMDDYYYY.substring(10,12));
        if (MMDDYYYY.length()>=14) ss=Integer.parseInt(MMDDYYYY.substring(12,14));

        TimeZone defaultTZ=TimeZone.getDefault();
        cal.clear();
        cal.setTimeZone(defaultTZ);
        cal.set(yyyy,mm-1,dd,hh,mi,ss);
        cal.add(Calendar.MILLISECOND,-getOffset(cal,tz));
        cal.add(Calendar.MILLISECOND,getOffset(cal,defaultTZ));
        return cal;
    }

    /**
     * MMDDYYYY형식의 문자열을 Calendar형식으로 변환
     */
    public static Calendar getCalendarMMDDYYYY(String MMDDYYYY) throws NumberFormatException {
        Calendar cal=Calendar.getInstance();
        String mmStr=MMDDYYYY.substring(0,2);
        String ddStr=MMDDYYYY.substring(2,4);
        String yyyyStr=MMDDYYYY.substring(4,8);
        int mm=Integer.parseInt(mmStr);
        int dd=Integer.parseInt(ddStr);
        int yyyy=Integer.parseInt(yyyyStr);
        int hh=0;
        int mi=0;
        int ss=0;
        if (MMDDYYYY.length()>=10) hh=Integer.parseInt(MMDDYYYY.substring(8,10));
        if (MMDDYYYY.length()>=12) mi=Integer.parseInt(MMDDYYYY.substring(10,12));
        if (MMDDYYYY.length()>=14) ss=Integer.parseInt(MMDDYYYY.substring(12,14));
        cal.clear();
        cal.set(yyyy,mm-1,dd,hh,mi,ss);
        return cal;
    }

    /**
     * DDMMYYYY형식의 문자열을 Calendar형식으로 변환
     */
    public static Calendar getCalendarDDMMYYYY(String DDMMYYYY,TimeZone tz) throws NumberFormatException {
        Calendar cal=Calendar.getInstance();
        String ddStr=DDMMYYYY.substring(0,2);
        String mmStr=DDMMYYYY.substring(2,4);
        String yyyyStr=DDMMYYYY.substring(4,8);
        int dd=Integer.parseInt(ddStr);
        int mm=Integer.parseInt(mmStr);
        int yyyy=Integer.parseInt(yyyyStr);
        int hh=0;
        int mi=0;
        int ss=0;
        if (DDMMYYYY.length()>=10) hh=Integer.parseInt(DDMMYYYY.substring(8,10));
        if (DDMMYYYY.length()>=12) mi=Integer.parseInt(DDMMYYYY.substring(10,12));
        if (DDMMYYYY.length()>=14) ss=Integer.parseInt(DDMMYYYY.substring(12,14));

        TimeZone defaultTZ=TimeZone.getDefault();
        cal.clear();
        cal.setTimeZone(defaultTZ);
        cal.set(yyyy,mm-1,dd,hh,mi,ss);
        cal.add(Calendar.MILLISECOND,-getOffset(cal,tz));
        cal.add(Calendar.MILLISECOND,getOffset(cal,defaultTZ));
        return cal;
    }

    /**
     * DDMMYYYY형식의 문자열을 Calendar형식으로 변환
     */
    public static Calendar getCalendarDDMMYYYY(String DDMMYYYY) throws NumberFormatException {
        Calendar cal=Calendar.getInstance();
        String ddStr=DDMMYYYY.substring(0,2);
        String mmStr=DDMMYYYY.substring(2,4);
        String yyyyStr=DDMMYYYY.substring(4,8);
        int dd=Integer.parseInt(ddStr);
        int mm=Integer.parseInt(mmStr);
        int yyyy=Integer.parseInt(yyyyStr);
        int hh=0;
        int mi=0;
        int ss=0;
        if (DDMMYYYY.length()>=10) hh=Integer.parseInt(DDMMYYYY.substring(8,10));
        if (DDMMYYYY.length()>=12) mi=Integer.parseInt(DDMMYYYY.substring(10,12));
        if (DDMMYYYY.length()>=14) ss=Integer.parseInt(DDMMYYYY.substring(12,14));
        cal.clear();
        cal.set(yyyy,mm-1,dd,hh,mi,ss);
        return cal;
    }

    /**
     * YYYYMMDD형식의 문자열을 Date형식으로 변환
     */
    public static Date getDateYYYYMMDD(String YYYYMMDD) throws NumberFormatException {
        return getCalendarYYYYMMDD(YYYYMMDD).getTime();
    }

    /**
     * MMDDYYYY형식의 문자열을 Date형식으로 변환
     */
    public static Date getDateMMDDYYYY(String MMDDYYYY) throws NumberFormatException {
        return getCalendarMMDDYYYY(MMDDYYYY).getTime();
    }

    /**
     * DDMMYYYY형식의 문자열을 Date형식으로 변환
     */
    public static Date getDateDDMMYYYY(String DDMMYYYY) throws NumberFormatException {
        return getCalendarDDMMYYYY(DDMMYYYY).getTime();
    }

    /**
     * YYYYMMDD형식의 문자열을 Date형식으로 변환
     */
    public static Date getDateYYYYMMDD(String YYYYMMDD,TimeZone tz) throws NumberFormatException {
        return getCalendarYYYYMMDD(YYYYMMDD,tz).getTime();
    }

    /**
     * MMDDYYYY형식의 문자열을 Date형식으로 변환
     */
    public static Date getDateMMDDYYYY(String MMDDYYYY,TimeZone tz) throws NumberFormatException {
        return getCalendarMMDDYYYY(MMDDYYYY,tz).getTime();
    }

    /**
     * DDMMYYYY형식의 문자열을 Date형식으로 변환
     */
    public static Date getDateDDMMYYYY(String DDMMYYYY,TimeZone tz) throws NumberFormatException {
        return getCalendarDDMMYYYY(DDMMYYYY,tz).getTime();
    }

   /**
    * YYYYMMDD형식의 문자열을 Timestamp형식으로 변환
    */
    public static Timestamp getTimestampYYYYMMDD(String YYYYMMDD) throws NumberFormatException {
        return new Timestamp(getDateYYYYMMDD(YYYYMMDD).getTime());
    }

   /**
    * MMDDYYYY형식의 문자열을 Timestamp형식으로 변환
    */
    public static Timestamp getTimestampMMDDYYYY(String MMDDYYYY) throws NumberFormatException {
        return new Timestamp(getDateMMDDYYYY(MMDDYYYY).getTime());
    }

   /**
    * DDMMYYYY형식의 문자열을 Timestamp형식으로 변환
    */
    public static Timestamp getTimestampDDMMYYYY(String DDMMYYYY) throws NumberFormatException {
        return new Timestamp(getDateDDMMYYYY(DDMMYYYY).getTime());
    }


   /**
    * YYYYMMDD형식의 문자열을 Timestamp형식으로 변환
    */
    public static Timestamp getTimestampYYYYMMDD(String YYYYMMDD,TimeZone tz) throws NumberFormatException {
        return new Timestamp(getDateYYYYMMDD(YYYYMMDD,tz).getTime());
    }

   /**
    * MMDDYYYY형식의 문자열을 Timestamp형식으로 변환
    */
    public static Timestamp getTimestampMMDDYYYY(String MMDDYYYY,TimeZone tz) throws NumberFormatException {
        return new Timestamp(getDateMMDDYYYY(MMDDYYYY,tz).getTime());
    }

   /**
    * DDMMYYYY형식의 문자열을 Timestamp형식으로 변환
    */
    public static Timestamp getTimestampDDMMYYYY(String DDMMYYYY,TimeZone tz) throws NumberFormatException {
        return new Timestamp(getDateDDMMYYYY(DDMMYYYY,tz).getTime());
    }

    /**
     * Date 표현 형태를 조회한다.
     *@return FORMAT_YYYYMMDD || FORMAT_MMDDYYYY || FORMAT_DDMMYYYY
     */
    public static int getDateFormat(Locale locale) {
        String datePattern=((SimpleDateFormat)DateFormat.getDateInstance(DateFormat.MEDIUM,locale)).toPattern();
        DatePatternTokenizer st=new DatePatternTokenizer(datePattern);
        int formatCode=0;
        while (st.hasMoreTokens()) {
            String token=st.nextToken();
            if ("yy".equals(token) || "yyyy".equals(token)) {
                formatCode=formatCode*10+1;
            } else if ("M".equals(token) || "MM".equals(token) || "MMM".equals(token) || "MMMM".equals(token)) {
                formatCode=formatCode*10+2;
            } else if ("d".equals(token) || "dd".equals(token)) {
                formatCode=formatCode*10+3;
            }
        }
        return formatCode;
    }

    /**
     * YYYYMMDD, MMDDYYYY, DDMMYYYY형태의 문자열을 locale에따라
     * Timestamp형태로 변형한다.
     */
    public static Timestamp getTimestamp(String timeParam,Locale locale,TimeZone tz) {
        Timestamp t=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                t=getTimestampYYYYMMDD(timeParam,tz);
            break;
            case FORMAT_MMDDYYYY :
                t=getTimestampMMDDYYYY(timeParam,tz);
            break;
            case FORMAT_DDMMYYYY :
                t=getTimestampDDMMYYYY(timeParam,tz);
            break;
        }
        return t;
    }

    /**
     * YYYYMMDD, MMDDYYYY, DDMMYYYY형태의 문자열을 locale에따라
     * Date형태로 변형한다.
     */
    public static Date getDate(String timeParam,Locale locale,TimeZone tz) {
        Date d=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                d=getDateYYYYMMDD(timeParam,tz);
            break;
            case FORMAT_MMDDYYYY :
                d=getDateMMDDYYYY(timeParam,tz);
            break;
            case FORMAT_DDMMYYYY :
                d=getDateDDMMYYYY(timeParam,tz);
            break;
        }
        return d;
    }

    /**
     * YYYYMMDD, MMDDYYYY, DDMMYYYY형태의 문자열을 locale에따라
     * Calendar형태로 변형한다.
     */
    public static Calendar getCalendar(String timeParam,Locale locale,TimeZone tz) {
        Calendar c=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                c=getCalendarYYYYMMDD(timeParam,tz);
            break;
            case FORMAT_MMDDYYYY :
                c=getCalendarMMDDYYYY(timeParam,tz);
            break;
            case FORMAT_DDMMYYYY :
                c=getCalendarDDMMYYYY(timeParam,tz);
            break;
        }
        return c;
    }

    /**
     * YYYYMMDD, MMDDYYYY, DDMMYYYY형태의 문자열을 locale에따라
     * Timestamp형태로 변형한다.
     */
    public static Timestamp getTimestamp(String timeParam,Locale locale) {
        Timestamp t=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                t=getTimestampYYYYMMDD(timeParam);
            break;
            case FORMAT_MMDDYYYY :
                t=getTimestampMMDDYYYY(timeParam);
            break;
            case FORMAT_DDMMYYYY :
                t=getTimestampDDMMYYYY(timeParam);
            break;
        }
        return t;
    }

    /**
     * YYYYMMDD, MMDDYYYY, DDMMYYYY형태의 문자열을 locale에따라
     * Date형태로 변형한다.
     */
    public static Date getDate(String timeParam,Locale locale) {
        Date d=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                d=getDateYYYYMMDD(timeParam);
            break;
            case FORMAT_MMDDYYYY :
                d=getDateMMDDYYYY(timeParam);
            break;
            case FORMAT_DDMMYYYY :
                d=getDateDDMMYYYY(timeParam);
            break;
        }
        return d;
    }

    /**
     * YYYYMMDD, MMDDYYYY, DDMMYYYY형태의 문자열을 locale에따라
     * Calendar형태로 변형한다.
     */
    public static Calendar getCalendar(String timeParam,Locale locale) {
        Calendar c=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                c=getCalendarYYYYMMDD(timeParam);
            break;
            case FORMAT_MMDDYYYY :
                c=getCalendarMMDDYYYY(timeParam);
            break;
            case FORMAT_DDMMYYYY :
                c=getCalendarDDMMYYYY(timeParam);
            break;
        }
        return c;
    }

    /**
     * 년월일 정보를 locale에따라 YYYYMMDD, MMDDYYYY 또는 DDMMYYY형식의
     * 문자열로 변환한다.
     *@param timeParam 년월일 정보
     *@param locale 문자열 변환을 위한 locale 정보
     */
    public static String getDateString(Calendar timeParam,Locale locale) {
        String str=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                str=getYYYYMMDD(timeParam);
            break;
            case FORMAT_MMDDYYYY :
                str=getMMDDYYYY(timeParam);
            break;
            case FORMAT_DDMMYYYY :
                str=getDDMMYYYY(timeParam);
            break;
        }
        return str;
    }

    /**
     * 년월일, 시분초 정보를 locale에따라 YYYYMMDDHHMISS, MMDDYYYYHHMISS
     * 또는 DDMMYYYHHMISS형식의 문자열로 변환한다.
     *@param timeParam 년월일 정보
     *@param locale 문자열 변환을 위한 locale 정보
     */
    public static String getDateTimeString(Calendar timeParam,Locale locale) {
        String str=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                str=getYYYYMMDDHHMISS(timeParam);
            break;
            case FORMAT_MMDDYYYY :
                str=getMMDDYYYYHHMISS(timeParam);
            break;
            case FORMAT_DDMMYYYY :
                str=getDDMMYYYYHHMISS(timeParam);
            break;
        }
        return str;
    }

    /**
     * 년월일 정보를 locale에따라 YYYYMMDD, MMDDYYYY 또는 DDMMYYY형식의
     * 문자열로 변환한다.
     *@param timeParam 년월일 정보
     *@param locale 문자열 변환을 위한 locale 정보
     */
    public static String getDateString(Date timeParam,Locale locale) {
        String str=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                str=getYYYYMMDD(timeParam);
            break;
            case FORMAT_MMDDYYYY :
                str=getMMDDYYYY(timeParam);
            break;
            case FORMAT_DDMMYYYY :
                str=getDDMMYYYY(timeParam);
            break;
        }
        return str;
    }

    /**
     * 년월일, 시분초 정보를 locale에따라 YYYYMMDDHHMISS, MMDDYYYYHHMISS
     * 또는 DDMMYYYHHMISS형식의 문자열로 변환한다.
     *@param timeParam 년월일 정보
     *@param locale 문자열 변환을 위한 locale 정보
     */
    public static String getDateTimeString(Date timeParam,Locale locale) {
        String str=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                str=getYYYYMMDDHHMISS(timeParam);
            break;
            case FORMAT_MMDDYYYY :
                str=getMMDDYYYYHHMISS(timeParam);
            break;
            case FORMAT_DDMMYYYY :
                str=getDDMMYYYYHHMISS(timeParam);
            break;
        }
        return str;
    }

    /**
     * 년월일 정보를 locale에따라 YYYYMMDD, MMDDYYYY 또는 DDMMYYY형식의
     * 문자열로 변환한다.
     *@param timeParam 년월일 정보
     *@param locale 문자열 변환을 위한 locale 정보
     */
    public static String getDateString(Timestamp timeParam,Locale locale) {
        String str=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                str=getYYYYMMDD(timeParam);
            break;
            case FORMAT_MMDDYYYY :
                str=getMMDDYYYY(timeParam);
            break;
            case FORMAT_DDMMYYYY :
                str=getDDMMYYYY(timeParam);
            break;
        }
        return str;
    }

    /**
     * 년월일, 시분초 정보를 locale에따라 YYYYMMDDHHMISS, MMDDYYYYHHMISS
     * 또는 DDMMYYYHHMISS형식의 문자열로 변환한다.
     *@param timeParam 년월일 정보
     *@param locale 문자열 변환을 위한 locale 정보
     */
    public static String getDateTimeString(Timestamp timeParam,Locale locale) {
        String str=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                str=getYYYYMMDDHHMISS(timeParam);
            break;
            case FORMAT_MMDDYYYY :
                str=getMMDDYYYYHHMISS(timeParam);
            break;
            case FORMAT_DDMMYYYY :
                str=getDDMMYYYYHHMISS(timeParam);
            break;
        }
        return str;
    }

    /**
     * day만큼의 '일'을 더한다.
     */
    public static Calendar addDate(Calendar timeParam,int day) {
        if (day!=0) {
            timeParam.add(Calendar.DATE,day);
        }
        return timeParam;
    }

    /**
     * month만큼의 '월'을 더한다.
     */
    public static Calendar addMonth(Calendar timeParam,int month) {
        if (month!=0) {
            timeParam.add(Calendar.MONTH,month);
        }
        return timeParam;
    }

    /**
     * year만큼의 '년'을 더한다.
     */
    public static Calendar addYear(Calendar timeParam,int year) {
        if (year!=0) {
            timeParam.add(Calendar.YEAR,year);
        }
        return timeParam;
    }

    /**
     * day만큼의 '일'을 더한다.
     */
    public static Date addDate(Date timeParam,int day) {
        if (day!=0) {
            Calendar cal=Calendar.getInstance();
            cal.setTime(timeParam);
            cal=addDate(cal,day);
            return cal.getTime();
        }
        return timeParam;
    }

    /**
     * month만큼의 '월'을 더한다.
     */
    public static Date addMonth(Date timeParam,int month) {
        if (month!=0) {
            Calendar cal=Calendar.getInstance();
            cal.setTime(timeParam);
            cal=addMonth(cal,month);
            return cal.getTime();
        }
        return timeParam;
    }

    /**
     * year만큼의 '년'을 더한다.
     */
    public static Date addYear(Date timeParam,int year) {
        if (year!=0) {
            Calendar cal=Calendar.getInstance();
            cal.setTime(timeParam);
            cal=addYear(cal,year);
            return cal.getTime();
        }
        return timeParam;
    }

    /**
     * day만큼의 '일'을 더한다.
     */
    public static Timestamp addDate(Timestamp timeParam,int day) {
        if (day!=0) {
            Calendar cal=Calendar.getInstance();
            cal.setTime(timeParam);
            cal=addDate(cal,day);
            return new Timestamp(cal.getTime().getTime());
        }
        return timeParam;
    }

    /**
     * month만큼의 '월'을 더한다.
     */
    public static Timestamp addMonth(Timestamp timeParam,int month) {
        if (month!=0) {
            Calendar cal=Calendar.getInstance();
            cal.setTime(timeParam);
            cal=addMonth(cal,month);
            return new Timestamp(cal.getTime().getTime());
        }
        return timeParam;
    }

    /**
     * year만큼의 '년'을 더한다.
     */
    public static Timestamp addYear(Timestamp timeParam,int year) {
        if (year!=0) {
            Calendar cal=Calendar.getInstance();
            cal.setTime(timeParam);
            cal=addYear(cal,year);
            return new Timestamp(cal.getTime().getTime());
        }
        return timeParam;
    }

    /**
     * Calendar의 TimeZone을 지정된 TimeZone으로 변경한다.<br>
     * 이때 Time Zone offset에 따라 시간이 변경된다.
     *@param timeParam 시간 정보와 시간 정보의 Time Zone정보를 포함한다.
     *@param adjustTo 변경할 Time Zone
     *@return 지정된 Time Zone으로 변경된 Calendar
     */
    public static Calendar adjustTimeZone(Calendar timeParam,TimeZone adjustTo) {
		Calendar cal=(Calendar)timeParam.clone();
		cal.setTimeZone(adjustTo);
        cal.add(Calendar.MILLISECOND,-getOffset(cal,timeParam.getTimeZone()));
        cal.add(Calendar.MILLISECOND,getOffset(cal,adjustTo));
        return cal;
    }

    /**
     * 서버의 Locale Time Zone으로 생성된 Date정보를 지정된 TimeZone으로 변경한다.<br>
     * 이때 Time Zone offset에 따라 시간이 변경된다.
     *@param timeParam 시간 정보. 서버의 Local Time Zone
     *@param adjustTo 변경할 Time Zone
     *@return 지정된 Time Zone으로 변경된 Date
     */
    public static Date adjustLocalTimeZone(Date timeParam,TimeZone adjustTo) {
        Calendar cal=Calendar.getInstance();
        cal.clear();
        cal.setTime(timeParam);
        cal.add(Calendar.MILLISECOND,-getOffset(cal,cal.getTimeZone()));
        cal.add(Calendar.MILLISECOND,getOffset(cal,adjustTo));
        return cal.getTime();
    }

    /**
     * 서버의 Locale Time Zone으로 생성된 Timestamp정보를 지정된 TimeZone으로 변경한다.<br>
     * 이때 Time Zone offset에 따라 시간이 변경된다.
     *@param timeParam 시간 정보. 서버의 Local Time Zone
     *@param adjustTo 변경할 Time Zone
     *@return 지정된 Time Zone으로 변경된 Timestamp
     */
    public static Timestamp adjustLocalTimeZone(Timestamp timeParam,TimeZone adjustTo) {
        Calendar cal=Calendar.getInstance();
        cal.clear();
        cal.setTime(timeParam);
        cal.add(Calendar.MILLISECOND,-getOffset(cal,cal.getTimeZone()));
        cal.add(Calendar.MILLISECOND,getOffset(cal,adjustTo));
        return new Timestamp(cal.getTime().getTime());
    }

    /**
     * 특정 Time Zone의 Date정보를 서버의 Local Time Zone의 Date정보로 변경한다.<br>
     * 이때 Time Zone offset에 따라 시간이 변경된다.
     *@param timeParam 시간 정보.
     *@param adjustFrom 시간 정보의 Time Zone
     *@return 서버의 Local Time Zone으로 변경된 Date
     */
    public static Date adjustSystemTimeZone(Date timeParam,TimeZone adjustFrom) {
        Calendar cal=Calendar.getInstance();
        cal.clear();
        cal.setTime(timeParam);
        cal.add(Calendar.MILLISECOND,-getOffset(cal,adjustFrom));
        cal.add(Calendar.MILLISECOND,getOffset(cal,cal.getTimeZone()));
        return cal.getTime();
    }

    /**
     * 특정 Time Zone의 Timestamp정보를 서버의 Local Time Zone의 Timestamp정보로 변경한다.<br>
     * 이때 Time Zone offset에 따라 시간이 변경된다.
     *@param timeParam 시간 정보.
     *@param adjustFrom 시간 정보의 Time Zone
     *@return 서버의 Local Time Zone으로 변경된 Timestamp
     */
    public static Timestamp adjustSystemTimeZone(Timestamp timeParam,TimeZone adjustFrom) {
        Calendar cal=Calendar.getInstance();
        cal.clear();
        cal.setTime(timeParam);
        cal.add(Calendar.MILLISECOND,-getOffset(cal,adjustFrom));
        cal.add(Calendar.MILLISECOND,getOffset(cal,cal.getTimeZone()));
        return new Timestamp(cal.getTime().getTime());
    }

    public static String addSeparator(String str,String separator,Locale locale) {
        String yearStr=null;
        String monthStr=null;
        String dayStr=null;
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                yearStr=str.substring(0,4);
                monthStr=str.substring(4,6);
                dayStr=str.substring(6,8);
                return yearStr+separator+monthStr+separator+dayStr;
            case FORMAT_MMDDYYYY :
                monthStr=str.substring(0,2);
                dayStr=str.substring(2,4);
                yearStr=str.substring(4,8);
                return monthStr+separator+dayStr+separator+yearStr;
            case FORMAT_DDMMYYYY :
                dayStr=str.substring(0,2);
                monthStr=str.substring(2,4);
                yearStr=str.substring(4,8);
                return dayStr+separator+monthStr+separator+yearStr;
        }
        return null;
    }

    public static String removeSeparator(String str,String separator,Locale locale) {
        String yearStr=null;
        String monthStr=null;
        String dayStr=null;
        int index=0;
        int sepLength=((separator==null)?0:separator.length());
        switch(getDateFormat(locale)) {
            case FORMAT_YYYYMMDD :
                yearStr=str.substring(index,index+4);
                index+=(4+sepLength);
                monthStr=str.substring(index,index+2);
                index+=(2+sepLength);
                dayStr=str.substring(index,index+2);
            return yearStr+monthStr+dayStr;
            case FORMAT_MMDDYYYY :
                monthStr=str.substring(index,index+2);
                index+=(2+sepLength);
                dayStr=str.substring(index,index+2);
                index+=(2+sepLength);
                yearStr=str.substring(index,index+4);
            return monthStr+dayStr+yearStr;
            case FORMAT_DDMMYYYY :
                dayStr=str.substring(index,index+2);
                index+=(2+sepLength);
                monthStr=str.substring(index,index+2);
                index+=(2+sepLength);
                yearStr=str.substring(index,index+4);
            return dayStr+monthStr+yearStr;
        }
        return null;
    }

    public static Calendar getCalendar(int yyyy,int mm,int dd) {
        Calendar cal=Calendar.getInstance();
        cal.clear();
        cal.set(yyyy,mm-1,dd);
        return cal;
    }

    public static Date getDate(int yyyy,int mm,int dd) {
        Calendar cal=getCalendar(yyyy,mm,dd);
        return cal.getTime();
    }

    public static Timestamp getTimestamp(int yyyy,int mm,int dd) {
        Calendar cal=getCalendar(yyyy,mm,dd);
        return new Timestamp(cal.getTime().getTime());
    }

    public static Calendar getCalendar(int yyyy,int mm,int dd,TimeZone tz) {
        TimeZone defaultTZ=TimeZone.getDefault();
        Calendar cal=getCalendar(yyyy,mm,dd);
        cal.add(Calendar.MILLISECOND,-getOffset(cal,tz));
        cal.add(Calendar.MILLISECOND,getOffset(cal,defaultTZ));
        return cal;
    }

    public static Date getDate(int yyyy,int mm,int dd,TimeZone tz) {
        Calendar cal=getCalendar(yyyy,mm,dd,tz);
        return cal.getTime();
    }

    public static Timestamp getTimestamp(int yyyy,int mm,int dd,TimeZone tz) {
        Calendar cal=getCalendar(yyyy,mm,dd,tz);
        return new Timestamp(cal.getTime().getTime());
    }


    public static Calendar getCalendar(int yyyy,int mm,int dd,int hh,int mi,int ss) {
        Calendar cal=Calendar.getInstance();
        cal.clear();
        cal.set(yyyy,mm-1,dd,hh,mi,ss);
        return cal;
    }

    public static Date getDate(int yyyy,int mm,int dd,int hh,int mi,int ss) {
        Calendar cal=getCalendar(yyyy,mm,dd,hh,mi,ss);
        return cal.getTime();
    }

    public static Timestamp getTimestamp(int yyyy,int mm,int dd,int hh,int mi,int ss) {
        Calendar cal=getCalendar(yyyy,mm,dd,hh,mi,ss);
        return new Timestamp(cal.getTime().getTime());
    }

    public static Calendar getCalendar(int yyyy,int mm,int dd,int hh,int mi,int ss,TimeZone tz) {
        TimeZone defaultTZ=TimeZone.getDefault();
        Calendar cal=getCalendar(yyyy,mm,dd,hh,mi,ss);
        cal.add(Calendar.MILLISECOND,-getOffset(cal,tz));
        cal.add(Calendar.MILLISECOND,getOffset(cal,defaultTZ));
        return cal;
    }

    public static Date getDate(int yyyy,int mm,int dd,int hh,int mi,int ss,TimeZone tz) {
        Calendar cal=getCalendar(yyyy,mm,dd,hh,mi,ss,tz);
        return cal.getTime();
    }

    public static Timestamp getTimestamp(int yyyy,int mm,int dd,int hh,int mi,int ss,TimeZone tz) {
        Calendar cal=getCalendar(yyyy,mm,dd,hh,mi,ss,tz);
        return new Timestamp(cal.getTime().getTime());
    }
    
    public static void main(String args[]) {
    	Calendar stdCal=Calendar.getInstance();
    	String stdDateStr=stdCal.toString();
		Calendar gmtCal=DateUtil.adjustTimeZone(stdCal,java.util.TimeZone.getTimeZone("GMT"));
		String gmtDateStr=gmtCal.toString();
		Calendar pstCal=DateUtil.adjustTimeZone(stdCal,java.util.TimeZone.getTimeZone("PST"));
		String pstDateStr=pstCal.toString();
		Calendar kstCal=DateUtil.adjustTimeZone(stdCal,java.util.TimeZone.getTimeZone("Asia/Seoul"));
		String kstDateStr=kstCal.toString();
		
		System.out.println("stdDateStr="+stdDateStr);
		System.out.println("gmtDateStr="+gmtDateStr);
		System.out.println("pstDateStr="+pstDateStr);
		System.out.println("kstDateStr="+kstDateStr);
		
		System.out.println("stdDate="+stdCal.getTime());
		System.out.println("gmtDate="+gmtCal.getTime());
		System.out.println("pstDate="+pstCal.getTime());
		System.out.println("kstDate="+kstCal.getTime());
    }

}